"""
@name : user.py
@author : FanMY_71
@projectname: myflask
@Time: 2022/8/23-11:46
"""
from werkzeug.security import check_password_hash
from wtforms import Form, StringField
from wtforms.validators import DataRequired, Email, Regexp, ValidationError, EqualTo, AnyOf
from model.users import Users


class UserForm(Form):

    # 客户端需要传递参数的参数名
    # DataRequired: 必须传递，不能为空
    username = StringField(validators=[DataRequired()])
    # Email: 支持邮箱格式，message: 不合法时的提示信息
    email = StringField(validators=[DataRequired(), Email(message="邮箱不合法")])
    # Regexp: 要满足的正则表达式，\w{6,18}: 6到18位的单词字符
    password = StringField(validators=[DataRequired(), Regexp(r'\w{6,18}', message="密码不符合要求")])
    re_password = StringField(validators=[DataRequired(), EqualTo("password", message="两次输入的密码不同")])
    # 1\d{10}: 以1开头的10个数字
    mobile = StringField(validators=[DataRequired(), Regexp(r'1\d{10}',message="电话不符合要求+")])
    # sex = StringField(validators=[AnyOf(values=['F', 'M'], message="请输入正确的性别（F or M）")],default="S")

    # 自定义验证器，验证邮箱是否唯一
    # 自定义检查字段 方法名：validate_你要检查的字段
    # value: 客户端传来的email值
    def validate_email(self, value):
        if Users.query.filter_by(email=value.data).first():
            raise ValidationError("邮箱已存在")

    def validate_mobile(self, value):
        if Users.query.filter_by(mobile=value.data).first():
            raise ValidationError("手机号已存在")


class LoginForm(Form):
    userName = StringField(validators=[DataRequired(), Email(message="邮箱不合法")])
    password = StringField(validators=[DataRequired(), Regexp(r'\w{6,18}', message="密码不符合要求")])

    def validate(self):
        # 重写validate方法，继承原来的（form本身的validate）=> 为了校验userName和password是否符合标准，并添加新方法
        super().validate()
        # 客户端传来的userName和password是否符合要求
        if self.errors:
            return False
        # 现在数据库中查找是否有该用户
        user = Users.query.filter_by(email=self.userName.data).first()
        # check_password_hash(A,B) 会将B加密与A进行比较=>比较客户端传来的密码的密文与数据库中存储的是否相同
        # 用户存在且密码验证通过
        if user and check_password_hash(user.password, self.password.data):\
            return user
        else:
            raise ValidationError("验证失败！")

class UserModifyForm(Form):
    email = StringField(validators=[Email(message="邮箱不合法")])
    password = StringField(validators=[Regexp(r'\w{6,18}', message="密码不符合要求")])
    re_password = StringField(validators=[EqualTo("password", message="两次输入的密码不同")])

    def validate_email(self, value):
        if Users.query.filter_by(email=value.data).first():
            raise ValidationError("邮箱已存在")

    def validate_mobile(self, value):
        if Users.query.filter_by(mobile=value.data).first():
            raise ValidationError("手机号已存在")